/*
  2008-02-14
   1. 新增 today(), today(String) 兩個靜態的方法。
*/

package idv.jieh.commons.util;

/**
 * <p>Title: 藍色小惡魔的系統</p>
 *
 * 	　　CurrentDate 可以取得目前的時間和日期。<p>
 *  和以往版本差異的地方在於新的類別在每次呼叫方法的時候，會給予最新的時間資訊；<br>
 *  而以往的類別在建構的時候就會把所有設定都完成。所以當每次呼叫方法的時候，<br>
 *  所傳回的時間是建構時的資訊。
 *  <p>
 * 	　　也因為這個類別會在每次呼叫取得與時間相關的方法時，會傳回最新的資訊，<br>
 *  所以每個方法被呼叫的時候會花費比舊類別更多的資源。因此程式設計師撰寫的時候，<br>
 *  如果有保留資訊的必要時，請不要連續呼叫這個類別的方法。<br>
 * </p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: BlueImp</p>
 *
 * @author Jieh
 */

public class CurrentDate {
  /** 可以使用的日期設定：台灣 */
  public static String TAIWAN = "TW";
  /** 可以使用的日期設定：西元 */
  public static String AD = "AD";

  /**
   * 傳回一個含有完整時間資訊的 DateFormater 物件。<p>
   * 當輸入國碼和時制後，這個方法回傳回一個含有完整時間資訊
   * (年月日時分秒) 的 DateFormater 物件。
   * @param localCountry 國家碼。
   * @param meridian 是否要設定為 24 小時制的時間。true:24 小時制；false:12 小時制。
   * @return 含有完整時間資訊的 DateFormater。
   */
  public DateFormater getDateParser(String localCountry, boolean meridian) {
    String p = "/";
    DateFormater dp = new DateFormater();
    dp.setDate(this.getCrntDate(localCountry, p), p);
    dp.setTime(this.getCrntTime(p, meridian), p);
    return dp;
  }

  /**
   * 取得目前的日期。<p>
   * 使用者可以指定一個國家的參數，並且輸入日期格式中間的分隔字元，
   * 然後取得目前的日期(西元)，並顯示為兩位數的數字。格式如下：YY[/]MM[/]DD。<br>
   * 國家碼: TW - 中華民國 ，其他為西元年。通常要取得當地時間建議，
   * 會透過這個 class 中的 getLocalCrntDate() 來取得。<br>
   * @param localCountry 國家碼。
   * @param partition 分隔字元。
   * @return 格式化後的日期字串。
   */
  public String getCrntDate(String localCountry, String partition) {
    StringBuffer r = new StringBuffer();
    java.util.Calendar cal = java.util.Calendar.getInstance();
    java.text.DecimalFormat fmt = new java.text.DecimalFormat("00");

    int y = cal.get(cal.YEAR);
    if (localCountry.equals("TW")) {
      r.append(fmt.format(y - 1911));
    } else {
      r.append(fmt.format(y));
    }
    r.append(partition).append(fmt.format(cal.get(cal.MONTH) + 1));
    r.append(partition).append(fmt.format(cal.get(cal.DAY_OF_MONTH)));

    return r.toString();
  }

  /**
   * 取得當地的日期。<p>
   * 這個方法會依據輸入的分隔字元，將目前程式執行地的時間格式化後傳回，
   * 格式如下：YY[/]MM[/]DD。
   * @param partition 日期的分隔字元。
   * @return 格式化後目前的日期。
   */
  public String getLocalCrntDate(String partition) {
    return this.getCrntDate(java.util.Locale.getDefault().getCountry(), partition);
  }

  /**
   * 取得目前的時間。<p>
   * 使用者可以輸入兩個參數，分別是要在時間之間分隔的字元、
   * 和 24 時制或 12 時制。
   * 回傳格式會顯示為兩位數的數字，格式如下：HH[:]MI[:]SS。
   * @param partition 分隔字元。
   * @param meridian 是否要回傳 24 小時制的時間。true:24 小時制；false:12 小時制。
   * @return 格式化後目前的時間。
   */
  public String getCrntTime(String partition, boolean meridian) {
    StringBuffer r = new StringBuffer();

    java.util.Calendar cal = java.util.Calendar.getInstance();
    java.text.DecimalFormat fmt = new java.text.DecimalFormat("00");

    int h = cal.get(cal.HOUR);
    if (meridian && cal.get(cal.AM_PM) == cal.PM) {
      h += 12;
    }

    r.append(fmt.format(h)).append(partition);
    r.append(fmt.format(cal.get(cal.MINUTE))).append(partition);
    r.append(fmt.format(cal.get(cal.SECOND)));

    return r.toString();
  }

  /**
   * 取得目前日期為這個禮拜的第幾天。<p>
   * @return 今天是這個禮拜的第幾天。
   */
  public int getDayOfWeek() {
    java.util.Calendar cal = java.util.Calendar.getInstance();
    return cal.get(cal.DAY_OF_WEEK);
  }

  /**
   * 取得目前日期為這個月的第幾天。<p>
   * @return 今天是這個月的第幾天。
   */
  public int getDayOfMonth() {
    java.util.Calendar cal = java.util.Calendar.getInstance();
    return cal.get(cal.DAY_OF_MONTH);
  }

  /**
   * 取得目前日期為今年的第幾天。<p>
   * @return 今天是今年的第幾天。
   */
  public int getDayOfYear() {
    java.util.Calendar cal = java.util.Calendar.getInstance();
    return cal.get(cal.DAY_OF_YEAR);
  }

  /**
   * 取得當下的日期，並且格式內定為 yyyy-MM-dd。
   * @return String
   */
  public static String today(){
    return today("yyyy-MM-dd");
  }

  /**
   * 取得當下的日期，可自訂格式〈請參考 java.text.SimpleDateFormat〉。
   * @return String
   */
  public static String today(String format){
    return new java.text.SimpleDateFormat(format).format(java.util.Calendar.getInstance().getTime());
  }

  /*
   public static void main(String[] args) {
    CurrentDate me = new CurrentDate();
    System.out.println();
    System.out.println("1. getLocalCrnDate by partition is '-' : " + me.getLocalCrntDate("-"));
       System.out.println("2. getCrntDate by AD and partition is nothing : " + me.getCrntDate(me.AD, ""));
    System.out.println("3. getCrntDate by TAIWAN and partition is '/' : " + me.getCrntDate(me.TAIWAN, "/"));
    System.out.println("4. getCrntTime : " + me.getCrntTime(":", true));
    System.out.println("5. getDayOfWeek : " + me.getDayOfWeek());
    System.out.println("6. getDayOfMonth : " + me.getDayOfMonth());
    System.out.println("7. getDayOfYear : " + me.getDayOfYear());
    DateParser dp = me.getDateParser(me.TAIWAN, false);
    System.out.println("8. DateParser : 年 = " + dp.getYear() + ", 月 = " + dp.getMonth() + ", 日 = " + dp.getDay() + "; 時 = " + dp.getHour() + ", 分 = " + dp.getMinute() + ", 秒 = " + dp.getSecond());
   }
//*/
} // end class
